# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/10/9
# @File : 23.E - Traveler.py
import sys
MaxInt = sys.maxsize
MinInt = -MaxInt
def dp_solve():
    """
    dp[i][j] 的含义为：取完第 i 种颜色的球，且最后取的是左 (j为0)或右(j为1)端点时的最小答案
    :return:
    """
    dp = [[0]*2 for _ in range(n+1)]
    lastl,lastr = 0,0#初始，原点
    for i in range(1,n+1):
        if(leftmost[i]==MaxInt):
            dp[i] = dp[i-1]#颜色不一定连续的
            continue

        nowl = leftmost[i]
        nowr = rightmost[i]

        dp[i][0] = min(dp[i - 1][0] + abs(nowr - lastl) + abs(nowl - nowr),dp[i - 1][1] + abs(nowr - lastr) + abs(nowl - nowr))
        #从上一种颜色的左端到当前颜色的左端、从上一种颜色的右端到当前颜色的左端，看哪个小，但是计算时都是到达当前颜色的右端点再加上当前颜色左右端点之间距离。不能直接计算到达当前颜色的左端点，这样会重复算多了某一段。
        dp[i][1] = min(dp[i - 1][0] + abs(nowl - lastl) + abs(nowl - nowr),dp[i - 1][1] + abs(nowl - lastr) + abs(nowl - nowr))
        #同理
        lastl = nowl#把当前颜色标为上一种颜色
        lastr = nowr

    return min(dp[n][0]+abs(lastl),dp[n][1]+abs(lastr))


"""
我们可以发现，要想最优，对于某种颜色 c 而言，最后一个取的球一定是最大和最小端点中的一个(因为最大最小端点的两个球是肯定要拿的，
那么两个端点球肯定有个拿的先后顺序，如果我们先拿的是左端点球，那么我肯定一路扫过去最后拿右端点，
不然拿完右端点再返回去拿别的肯定浪费，先拿右端点的情况同理)。

按照颜色的顺序来做DP，当前颜色从前一个颜色转移过来。颜色不一定连续的。
"""
if __name__ == '__main__':
    n = int(input())
    leftmost = [MaxInt]*(n+1)
    rightmost = [MinInt]*(n+1)
    for _ in range(n):
        x,c = map(int,input().split())
        #记录下每种颜色的最左边的坐标 以及 最右边的坐标
        leftmost[c] = min(leftmost[c],x)
        rightmost[c] = max(rightmost[c],x)
    ans = dp_solve()
    print(ans)
